"""
日志模块整合工具

此模块提供统一的日志接口，整合系统日志和操作日志功能，
简化日志记录操作并确保接口一致性。

系统日志(logger_module)：记录系统级事件，用于调试、监控和排错
操作日志(operation_logger)：记录用户操作行为，用于审计和追踪
"""

# 导入系统日志模块的核心功能
from logger_module import (
    log_debug,
    log_info,
    log_warning,
    log_error,
    log_critical,
    log_exception,
    log_exceptions,
    log_performance
)

# 导入操作日志模块的核心功能
from operation_logger import (
    record_operation,
    record_login,
    record_logout,
    record_password_change,
    record_contract_operation,
    record_rent_record_operation,
    record_system_setting_change,
    record_note_operation,
    record_security_event,
    get_operation_logs,
    operation_logger  # 导入全局操作日志记录器实例
)

__all__ = [
    # 系统日志函数
    'log_debug',
    'log_info', 
    'log_warning',
    'log_error',
    'log_critical',
    'log_exception',
    'log_exceptions',
    'log_performance',
    
    # 操作日志函数
    'record_operation',
    'record_login',
    'record_logout',
    'record_password_change',
    'record_contract_operation',
    'record_rent_record_operation',
    'record_system_setting_change',
    'record_note_operation',
    'record_security_event',
    'get_operation_logs',
    'operation_logger',  # 导出全局操作日志记录器实例
    
    # 日志级别常量
    'LOG_LEVELS'
]

# 日志级别常量，便于统一使用
LOG_LEVELS = {
    'DEBUG': 'DEBUG',
    'INFO': 'INFO',
    'WARNING': 'WARNING',
    'ERROR': 'ERROR',
    'CRITICAL': 'CRITICAL'
}


def setup_logging():
    """
    初始化和配置所有日志系统
    
    此函数应该在应用程序启动时调用，确保所有日志模块都正确初始化
    """
    # 系统日志模块会在导入时自动初始化，这里主要是确保操作日志模块也正常初始化
    try:
        from operation_logger import operation_logger
        # 触发配置加载以确保操作日志记录器正常工作
        operation_logger.update_config()
        log_info("所有日志系统初始化完成")
        return True
    except Exception as e:
        # 如果日志初始化失败，尝试使用基本的异常处理
        try:
            log_error(f"日志系统初始化部分失败: {str(e)}")
        except:
            # 如果连日志记录都失败，至少确保程序不会崩溃
            pass
        return False


def log_with_context(message, context=None, level='INFO'):
    """
    带上下文信息的系统日志记录
    
    Args:
        message: 日志消息
        context: 上下文信息字典
        level: 日志级别
    """
    # 构建带上下文的完整消息
    full_message = message
    if context:
        try:
            import json
            context_str = json.dumps(context, ensure_ascii=False)
            full_message = f"{message} | 上下文: {context_str}"
        except Exception:
            # 如果上下文序列化失败，至少记录原始消息
            full_message = f"{message} | 上下文序列化失败"
    
    # 根据日志级别调用相应的函数
    if level == 'DEBUG':
        log_debug(full_message)
    elif level == 'INFO':
        log_info(full_message)
    elif level == 'WARNING':
        log_warning(full_message)
    elif level == 'ERROR':
        log_error(full_message)
    elif level == 'CRITICAL':
        log_critical(full_message)
    else:
        # 默认使用INFO级别
        log_info(full_message)


def format_operation_detail(detail_dict):
    """
    格式化操作日志的详细信息，确保正确处理各种数据类型
    
    Args:
        detail_dict: 详细信息字典
        
    Returns:
        格式化后的详细信息字典
    """
    if not isinstance(detail_dict, dict):
        return {"value": str(detail_dict)}
    
    # 处理特殊类型的字段
    formatted_detail = {}
    for key, value in detail_dict.items():
        # 处理None值
        if value is None:
            formatted_detail[key] = "None"
        # 处理日期/时间对象
        elif hasattr(value, 'strftime'):
            try:
                formatted_detail[key] = value.strftime('%Y-%m-%d %H:%M:%S')
            except Exception:
                formatted_detail[key] = str(value)
        # 处理可能过大的列表
        elif isinstance(value, list) and len(value) > 10:
            formatted_detail[key] = f"列表 (包含 {len(value)} 个元素)"
        # 其他类型直接转换为字符串
        else:
            formatted_detail[key] = str(value)
    
    return formatted_detail


class LogManager:
    """
    日志管理器，提供更面向对象的日志记录接口
    
    这是一个可选的高级接口，简化日志记录操作
    """
    
    @staticmethod
    def system_log(message, level='INFO', exception=None, context=None):
        """
        记录系统日志
        
        Args:
            message: 日志消息
            level: 日志级别
            exception: 可选的异常对象
            context: 可选的上下文信息
        """
        if exception:
            # 如果提供了异常对象，使用异常日志记录
            additional_info = message
            if context:
                additional_info += f" | 上下文: {str(context)}"
            log_exception(exception, additional_info)
        else:
            # 否则使用带上下文的普通日志
            log_with_context(message, context, level)
    
    @staticmethod
    def operation_log(user_id, username, module, content, result='成功', detail=None):
        """
        记录操作日志
        
        Args:
            user_id: 用户ID
            username: 用户名
            module: 操作模块
            content: 操作内容
            result: 操作结果
            detail: 详细信息
        """
        # 格式化详细信息
        formatted_detail = format_operation_detail(detail) if detail else None
        # 记录操作
        record_operation(
            user_id=user_id,
            username=username,
            operation_module=module,
            operation_content=content,
            operation_result=result,
            detail=formatted_detail
        )
    
    @staticmethod
    def performance_log(func, *args, **kwargs):
        """
        性能日志装饰器的快捷方式
        
        Args:
            func: 要监控性能的函数
            
        Returns:
            装饰后的函数
        """
        return log_performance(func)
